Создает упрощенную информацию о типе, которую может использовать реализация IDispatch.
HRESULT CreateDispTypeInfo ( INTERFACEDATA pidata, LCID kid, ITypelnfo FAR* FAR*pptinfo );
Параметры
pidata
Описание интерфейса, для которого создается
информация о типе.
lcid
Идентификатор местности для имен,
используемых в информации о типе.
pptinfo
После возврата содержит
указатель на реализацию информации о типе, которую можно использовать с
DispGetlDsOfNames и Displnvoke.
Коды возврата
Из возвращенного HRESULT получают один из следующих
кодов возврата:
Код возврата | Значение |
S_OK | Интерфейс поддерживается. |
E_INVALIDARG | Либо описание интерфейса, либо LCID неверны. |
E_OUTOFMEMORY | He хватает памяти для выполнения операции. |
Комментарии
Вы можете создать информацию о типе во время исполнения,
используя CreateDispTypelnfo и структуру INTERFACEDATA, которая
описывает предоставляемый объект.
Информация о типе, возвращаемая данной
функцией, предназначена главным образом для того, чтобы автоматизировать
реализацию IDispatch. CreateDispTypelnfo возвращает не всю
информацию о типе. Аргумент pidata — это не полное описание интерфейса.
Он не содержит информации для справочной системы, комментариев, необязательных
параметров и другой информации о типе, полезной в иных контекстах.
В связи с
этим рекомендуется использовать другой способ предоставления информации о типе
для объекта, а именно описание объекта на языке ODL и компиляцию этого
описания в библиотеку типа с помощью компилятора MIDL или утилиты
MkTypLib.
Вы можете воспользоваться информацией из библиотеки типа с
помощью функций LoadTypeLib и GetTypelnfoOfGuid вместо
CreateDispTypelnfo.
Пример
Приведенный ниже код создает информацию о типе из
INTERFACEDATA для предоставления объекта CCalc.
static METHODDATA NEARDATA rgmdataCCalc [] = { PROPERTY(VALUE, IMETH_ACCUM, IDMEMBER.ACCUM, VT_I4) PROPERTY(ACCUM, IMETH_ACCUM, IDMEMBER_ACCUM, VT_I4) PROPERTY(OPND, IMETH_OPERAND, IDMEMBER_OPERAND, VT_I4) PROPERTY(OP, IMETH_OPERATOR, IDMEMBER_OPERATOR, VT_I2) METHODO(EVAL, IMETH_EVAL, IDMEMBER_EVAL, VT_BOOL) METHODO(CLEAR, IMETH_CLEAR, IDMEMBER_CLEAR, VT_EMPTY) METHODO(DISPLAY, IMETH_DISPLAY, IDMEMBER_DISPLAY, VT_EMPTY) METHODO(QUIT, IMETH_QUIT, IDMEMBER_QUIT, VT_EMPTY) METHOD1(BUTTON, IMETH_BUTTON, IDMEMBER_BUTTON, VT_BOOL) } INTERFACEDATA NEARDATA g_idataCCalc = { rgmdataCCalc, DIM(rgmdataCCalc) } // Реализация IDispatch с помощью диспетчерских функций API. CCalc FAR* CCalc: :Create() { HRESULT hresult; CCalc FAR* pcalc; CArith FAR* parith; ITypelnfo FAR* ptinfo; IUnknown FAR* punkStdDisp; extern INTERFACEDATA NEARDATA g_idataCCalc; if ((pcalc = new FAR CCalc()) == NULL) return NULL; pcalc->AddRef(); parith = &(pcalc->m_arith); // Построить информацию о типе для функциональности данного объекта, // которая предоставляется для программного доступа извне. hresult = CreateDispTypeInfo( &g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo); if (hresult != NOERROR) goto LErrorO; // Создать агрегат с экземпляром стандартной реализации IDispatch, // инициализированной с помощью информации о типе. hresult = CreateStdDispatch( pcalc, // Управляющий IUnknown. parith, // Экземпляр для распределения вызовов. ptinfo, // Информация о типе, описывающая экземпляр. &punkStdDisp); ptinfo->Release(); if (hresult != NOERROR) goto LErrorO; pcalc->m_punkStdDisp = punkStdDisp; return pcalc; LErrorO: ; pcalc->Release(); return NULL; }